# from robot.api.deco import keyword
import os
import openpyxl
import warnings
import re

from Utils.获取文件绝对路径 import get_path

warnings.filterwarnings('ignore')


class Excel():

    def __init__(self, workbook=None, fileName=None):
        self.workbook = workbook
        self.fileName = fileName

    def _try_except(func):
        def wrapper(*args, **kwargs):
            try:
                return func
            except KeyError:
                return "sheet不存在,请检查sheet名称是否正确"

        return wrapper

    def __enter__(self):
        #加载工作簿
        self.workbook = openpyxl.load_workbook(self.fileName)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.workbook.close()

    def sheets(self):
        """
        获取excel中所有sheet名称并以list返回
        :return: list
        """
        return self.workbook.sheetnames

    def _sheet_name(self, sheet_name: str):
        """
        hzero高版本导出Excel,有分页功能,sheet名称带有-1/-2
        如果sheet_name传参未带-1,而导出的excel sheet有分页,则默认返回sheet_name-1
        如果sheet_name传参未带-1,且导出的excel sheet没有分页,则返回sheet_name
        如果sheet_name-n,则直接返回sheet_name-n
        :param sheet_name: sheet名称
        :return:
        """
        # 如果sheet名称带有-n,则直接返回sheet名称
        if re.search(r"-\d", sheet_name):
            return sheet_name
        # 根据sheet名称获取sheet-n的sheet页,如果匹配到,则返回sheet-1或sheet-n(多个匹配)列表
        for sheet in self.sheets():
            search_result = re.search(rf"{sheet_name}-1", sheet)
            if search_result is not None:
                return search_result.group()
        return sheet_name

    def get_row_value(self, sheet_name, row):
        """
        获取一整行数据,并以list返回
        :param sheet_name: sheet名称
        :param row: 行号
        :return: 行数据list
        """
        row = int(row)
        sheet = self.workbook[self._sheet_name(sheet_name)]
        columns = sheet.max_column
        return [sheet.cell(row=row, column=i).value for i in range(1, columns + 1)]

    def get_col_value(self, sheet_name, col):
        """
        获取一整列数据,并以list返回
        :param sheet_name: sheet名称
        :param col: 列号或列名
        :return: 列数据list
        """
        sheet = self.workbook[self._sheet_name(sheet_name)]
        rows = sheet.max_row
        try:
            col = int(col)
        except ValueError:
            th = self.get_row_value(sheet_name, 1)
            col = th.index(col)+1
        return [sheet.cell(row=i, column=col).value for i in range(1, rows + 1)]

    def row_count(self, sheet_name):
        sheet = self.workbook[self._sheet_name(sheet_name)]
        return sheet.max_row

    def write_excel(self, sheet_name, values, out_put_file=None):
        """
        excel追加写入数据
        :param sheet_name: sheet名称
        :param values: 数据列表,例如:两行数据[{"AP发票号": "AP001003", "协议编号": "XY003"}, {"AP发票号": "AP001004", "合同编号": "CON004"}]
        :param out_put_file: 输出文件,如此参数不传,则修改原文件
        """
        index = len(values)  # 获取需要写入数据的行数
        sheet = self.workbook[self._sheet_name(sheet_name)]
        th = self.get_row_value(self._sheet_name(sheet_name), 1)
        rows = sheet.max_row  # 获取表格中已存在的数据的行数
        max_row_value = self.get_row_value(self._sheet_name(sheet_name), rows)  # 获取表格中已存在的数据的最后一行数据
        # 如果最大行不为空,则行数+1
        if set(max_row_value) != {None}:
            rows += 1
        for row in range(0, index):
            value = values[row]
            for col in value.keys():
                sheet.cell(row=rows + row, column=th.index(col) + 1).value = value[col]
        if out_put_file:
            self.workbook.save(out_put_file)  # 保存工作簿
        else:
            self.workbook.save(self.fileName)

    @staticmethod
    # @keyword('Read Row data')
    def readrowdata(excelpath, sheetname, rownum: int):
        """
        只支持后缀为.xlsx的新版本excel

        读取某一行的数据

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        rownum: 行号,从1开始,整型数字

        """
        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                sheet = wb[sheetname]
                rowlist = []
                for cell_object in list(sheet.rows)[rownum - 1]:
                    # print(cell_object.value)
                    # if cell_object.value is not None and len(cell_object.value) != 0:
                    if cell_object.value is not None:
                        rowlist.append(cell_object.value)
                return rowlist

    @staticmethod
    # @keyword('Read Column Data')
    def readcolmundata(excelpath, sheetname, columnum: int):
        """
        只支持后缀为.xlsx的新版本excel

        读取某一列的数据

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        columnum: 列号,从1开始,整型数字

        """
        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                sheet = wb[sheetname]
                columnumlist = []
                for cell_object in list(sheet.columns)[columnum - 1]:
                    # print(cell_object.value)
                    if cell_object.value is not None and len(cell_object.value) != 0:
                        columnumlist.append(cell_object.value)
                return columnumlist

    @staticmethod
    # @keyword('Read Cell Data')
    def readcelldata(excelpath, sheetname, rownum: int, columnum: int):
        """
        只支持后缀为.xlsx的新版本excel

        读取某一个单元格的数据

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        rownum: 行号,从1开始,整型数字

        columnum: 列号,从1开始,整型数字

        """

        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                wb = openpyxl.load_workbook(excelpath)
                sheet = wb[sheetname]
                # print(sheet[cellname].value)
                return sheet.cell(rownum, columnum).value

    @staticmethod
    # @keyword('Write Cell Data')
    def writecelldata(excelpath, sheetname, rownum: int, columnum: int, text):
        """
        只支持后缀为.xlsx的新版本excel

        写入数据至指定的单元格

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        rownum: 行号,从1开始,整型数字

        columnum: 列号,从1开始,整型数字

        """

        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                wb = openpyxl.load_workbook(excelpath)
                sheet = wb[sheetname]
                sheet.cell(rownum, columnum).value = text
                wb.save(excelpath)

    @staticmethod
    # @keyword('Delete Row Data')
    def delete_row_data(excelpath, sheetname, rownum: int):
        """
        删除某一行数据
        只支持后缀为.xlsx的新版本excel

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        rownum: 行号,从1开始,整型数字
        """
        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                wb = openpyxl.load_workbook(excelpath)
                sheet = wb[sheetname]
                sheet.delete_rows(rownum - 1)
                wb.save(excelpath)

    @staticmethod
    # @keyword('Delete Column Data')
    def delete_column_data(excelpath, sheetname, columnum: int):
        """
        删除某一列数据,
        只支持后缀为.xlsx的新版本excel

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        column: 列号,从1开始,整型数字
        """
        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                wb = openpyxl.load_workbook(excelpath)
                sheet = wb[sheetname]
                sheet.delete_cols(columnum - 1)
                wb.save(excelpath)

    @staticmethod
    # @keyword('Delete Cell Data')
    def delete_cell_data(excelpath, sheetname, rownum: int, columnum: int):
        """
        删除某一单元格的数据,
        只支持后缀为.xlsx的新版本excel

        sheetname: 表名称

        excelpath: excel文件的绝对路径 表名称.xlsx

        rownum: 行号,从1开始,整型数字

        column: 列号,从1开始,整型数字
        """
        if not os.path.exists(excelpath):
            print('xlsx文件不存在，请检查 ！！！')
        else:
            wb = openpyxl.load_workbook(excelpath)
            if sheetname not in wb.sheetnames:
                print('名为' + sheetname + '的文sheet页不存在，请检查 ！！！')
            else:
                wb = openpyxl.load_workbook(excelpath)
                sheet = wb[sheetname]
                sheet.cell(rownum, columnum).value = None
                wb.save(excelpath)


if __name__ == '__main__':
    # excel=Excel()
    # excel.open_excel(r'C:\winni\code\playwright-demo-master\TestFiles\test上传文件.xlsx')
    with Excel(fileName=get_path(f"/TestFiles/test上传文件.xlsx")) as excel:
        print(excel.sheets())
        print(excel.get_col_value("Sheet1", 1))
        # print(excel.readcolmundata("Sheet1", 1))
        # print(excel.get_col_value("Sheet1","年龄"))
        # print(excel.get_row_value("Sheet1",1))
        # print(excel.row_count("Sheet1"))
        # print(excel.sheets())
        # print(excel.fileName)
        # print(excel.readcolmundata(r'C:\winni\code\playwright-demo-master\TestFiles\test上传文件.xlsx', "Sheet1",1))
        # print(excel.readcelldata(r'C:\winni\code\playwright-demo-master\TestFiles\test上传文件.xlsx',"Sheet1",2,1))
        # print(excel.readrowdata(r'C:\winni\code\playwright-demo-master\TestFiles\test上传文件.xlsx', "Sheet1",2))
        # excel.writecelldata(r'C:\winni\code\playwright-demo-master\TestFiles\test上传文件.xlsx',"Sheet1", 3, 1,"写入test")
        # list = [{'商品编码': 'PLAY001', '编辑开关': 'Y', '运动类型': '运动类型', '活动属性': '活动属性'},
        #  {'商品编码': 'MWN007', '编辑开关': 'Y', '运动类型': '运动类型', '活动属性': '活动属性'}]
        # excel.write_excel("article信息",list)
        # print(excel.sheets())
